package com.jeeplus.modules.api.utils;

import com.jeeplus.core.web.BaseController;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.UnsupportedJwtException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Component
@Slf4j
public class JwtUtils extends BaseController {

    /**
     * 生成token信息并返回
     *
     * @param claims
     * @return
     */
    public Map<String, Object> generateToken(Map<String, Object> claims) {
        if (Objects.isNull(claims)) {
            claims = new HashMap<>(16);
        }
        Date date = new Date(System.currentTimeMillis() + Long.parseLong(jwtExpirationTime) * 1000);
        log.info("过期时间：{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
        String jwt = Jwts.builder().setClaims(claims).setExpiration(date).signWith(SignatureAlgorithm.HS512, jwtSecret).compact();
        log.debug("生成的token:{}", jwt);
        Map<String, Object> map = new HashMap<>(16);
        map.put("token", jwtTokenPrefix + jwt);
//        map.put("token-type", jwtTokenPrefix);
//        map.put("expire-time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
        return map;
    }

    /**
     * 检验并解析token
     * IllegalArgumentException:JWT字符串参数不能为空或null。
     * SignatureException:字符串伪造 并不是服务端颁发的token
     * MalformedJwtException:字符串缺失
     * ExpiredJwtException：token已过期
     * UnsupportedJwtException:未知
     */
    public String validateTokenAndGetClaims(String token) {
        Map<String, Object> body = null;
        try {
            Jwts.parser().setSigningKey(jwtSecret)
                    .parseClaimsJws(token.replace(jwtTokenPrefix, ""))
                    .getBody();
        } catch (UnsupportedJwtException e) {
            e.printStackTrace();
        } catch (ExpiredJwtException e) {
            return "过期";
        }
        return "通过";
    }
}
